package py.progweb.sgc.gui.client.widget;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import py.progweb.sgc.gui.client.service.DialogModelService;
import py.progweb.sgc.gui.client.service.DialogModelServiceAsync;
import py.progweb.sgc.gui.shared.dialogmodel.DataRecord;
import py.progweb.sgc.gui.shared.dialogmodel.ProductosModel;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.ListGridEditEvent;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
import com.smartgwt.client.widgets.form.validator.RegExpValidator;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.CellSavedEvent;
import com.smartgwt.client.widgets.grid.events.CellSavedHandler;
import com.smartgwt.client.widgets.grid.events.ChangedHandler;
import com.smartgwt.client.widgets.grid.events.EditorExitEvent;
import com.smartgwt.client.widgets.grid.events.EditorExitHandler;


/**
 * Tabla para productos de altas de compra y venta
 *
 */
public class TablaProductos extends ListGrid {
	
	public List<DataRecord> listProductos;
	ListGrid grid;
	DataSource ds;
	ListGridField producto, cantidad, precio;
	DialogModelServiceAsync service;
	Record actual;
	SelectItem selectProductos;

	public TablaProductos(String operacion) {
		super();
		
		this.grid = this;
		
		this.setWidth100();
		this.setHeight100();
		
		ds = new DataSource();
		DataSourceTextField dsfText;
		DataSourceIntegerField dsfInt;
		ds.setClientOnly(true);
		
		service = GWT.create(DialogModelService.class);
		
		/*Campo productos*/
		producto = new ListGridField("producto.nombre", "Producto");
		final DataSourceTextField dsfText2 = new DataSourceTextField("producto.nombre", "Producto");
		/*Se carga la lista de productos*/
		selectProductos= new SelectItem();
		if (operacion == "venta"){
			service.getProductosListadoModel(new AsyncCallback<ProductosModel>() {
				
				@Override
				public void onSuccess(ProductosModel result) {
					LinkedHashMap<String, String> productos = new LinkedHashMap<String, String>();
					productos.put("0", "Seleccione un producto...");
					TablaProductos.this.listProductos = result.getRecords();
					for(DataRecord item: TablaProductos.this.listProductos){
						productos.put(item.getPK().toString(), item.getAtributo("nombre").toString());
					}
	
					//TablaProductos.this.selectProductos.setValueMap(productos);
					producto.setValueMap(productos);
					TablaProductos.this.ds.addField(dsfText2);
				}
				
				@Override
				public void onFailure(Throwable caught) {
					Window.alert(caught.getMessage());
				}
			});
		}
		producto.setDefaultValue("0");
		//DoesntContainValidator containsValidator = new DoesntContainValidator();
		//containsValidator.setSubstring("0");
		//containsValidator.setErrorMessage("Por favor seleccione un producto");
		producto.addChangedHandler(new ChangedHandler(){

			@Override
			public void onChanged(
					com.smartgwt.client.widgets.grid.events.ChangedEvent event) {
				// TODO Auto-generated method stub
				actualizarFila();
			}
			
		});
		RegExpValidator regExpValidator = new RegExpValidator("^[1-9][0-9]*$");
		regExpValidator.setErrorMessage("Por favor elija un producto");
		producto.setValidators(regExpValidator);
		producto.setEditorType(selectProductos);
		
		/*Campo cantidad*/
		cantidad = new ListGridField("cantidad", "Cantidad");
		//cantidad.setType(ListGridFieldType.TEXT);
		cantidad.setDefaultValue(1);
		dsfInt = new DataSourceIntegerField("cantidad", "Cantidad");
		IntegerRangeValidator cantidadValidator= new IntegerRangeValidator();
		cantidadValidator.setMin(1);
		cantidadValidator.setErrorMessage("Ingrese una cantidad mayor a 0");
		dsfInt.setValidators(cantidadValidator);
		dsfInt.setName("cantidad");
		ds.addField(dsfInt);
		
		/*Campo precio*/
		if (operacion == "venta")
			precio = new ListGridField("precioVenta", "Precio");
		else{
			precio = new ListGridField("precioCompra", "Precio");
			precio.setRequired(true);
		}
		//precio.setType(ListGridFieldType.TEXT);
		if (operacion.equals("venta"))
			precio.setCanEdit(false);
		if (operacion == "venta")
			dsfInt = new DataSourceIntegerField("precioVenta", "Precio");
		else
			dsfInt = new DataSourceIntegerField("precioCompra", "Precio");
		//dsfText.setName("precio");
		ds.addField(dsfInt);
		
		if (operacion == "venta"){
			producto.addCellSavedHandler(new CellSavedHandler(){
	
				@Override
				public void onCellSaved(CellSavedEvent event) {
					// TODO Auto-generated method stub
					actualizarFila();
				}
				
			});
			
			producto.addEditorExitHandler(new EditorExitHandler(){
	
				@Override
				public void onEditorExit(EditorExitEvent event) {
					// TODO Auto-generated method stub
					actualizarFila();
				}
				
			});
		}
		//producto.setEditorType(selectProductos);
		this.grid.setFields(producto, cantidad, precio);
		
		this.grid.setDataSource(ds);
		this.grid.setSelectionType(SelectionStyle.SINGLE);
		this.grid.setCanEdit(true); 
		this.grid.setEditEvent(ListGridEditEvent.DOUBLECLICK);  
        //this.grid.setListEndEditAction(RowEndEditAction.NEXT);  
        this.grid.setSaveLocally(true);
        this.grid.setCanRemoveRecords(true);
	}
	
	public List<DataRecord> getFilasSeleccionadas() {
		ListGridRecord [] records = this.grid.getSelection();
		ArrayList<DataRecord> result = new ArrayList<DataRecord>();
		
		for(ListGridRecord r : records) 
			result.add((DataRecord)r.getAttributeAsObject("_dataRecord"));
		
		return result;
	}
	
	public void actualizarFila(){
		actual = this.grid.getRecord(this.grid.getEditRow());
		for(DataRecord item: this.listProductos){
			if((Integer)item.getPK() == Integer.parseInt(actual.getAttribute("producto.nombre"))){
				//Window.alert(item.getAtributo("precio_actual").toString());
				Integer precioVenta = (Integer)item.getAtributo("precio_actual") 
					+ (Integer)item.getAtributo("precio_actual")*(Integer)item.getAtributo("ganancia")/100; 
				actual.setAttribute("precioVenta", precioVenta.toString());
				this.grid.updateData(actual);
			}
		}
	}
	
	public void setProductoValueMap(LinkedHashMap<String, String> valueMap){
		this.producto.setValueMap(valueMap);
	}
}

